package com.daodway.designpattern.innerclass;

public class Outer {
    private int x = 1;
    
    class Inner {
	        int x = 2;
	        public void seeOuter() {
	             int x = 3;
	             /*规则1:内部类可以直接访问外部类中的成员，包括私有
	              * 原因：因为在内部类中持有一个外部类的应用，格式：外部类.this*/
	             System.out.println(x);
	             System.out.println(this.x);
	             System.out.println(Outer.this.x);
	       }
    }
    /*规则2:外部类要访问内部类，必须建立内部类对象
     * 前置条件:从外部类的非静态方法中访问内部类*/
    public void seeInner1() {
    	   Inner in = new Inner();
    	   in.seeOuter();
    }    
    /*规则2:外部类要访问内部类，必须建立内部类对象
     * 前置条件:从外部类的静态方法中访问内部类*/    
    public static void seeInner2(){
    		//静态方法中只能以下面的这种方式构建内部类对象
    	   Outer.Inner inner  = new Outer().new Inner(); //1
    	   //如果把1位置的访问方式换成 new Inner().seeOuter() 必须保证Inner是静态的
    	   inner.seeOuter();
    }
    
    public static void main(String args[]){
    	Inner inner = new Outer().new Inner();
    	inner.seeOuter();
    	Outer out = new Outer();
    	out.seeInner1();
    	Outer.seeInner2();
    }
}
